//
//  UIView+Util.m
//  wozhua
//
//  Created by 王洋 on 14-10-13.
//  Copyright (c) 2014年 王洋. All rights reserved.
//

#import "UIView+Util.h"
#import <QuartzCore/QuartzCore.h>
 #import<objc/runtime.h>

static char viewTapKey;

@implementation UIView (Util)

//nib loading

+ (id)instanceWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil owner:(id)owner
{
    //default values
    NSString *nibName = nibNameOrNil ?: NSStringFromClass(self);
    NSBundle *bundle = bundleOrNil ?: [NSBundle mainBundle];
    
    //cache nib to prevent unnecessary filesystem access
    static NSCache *nibCache = nil;
    if (nibCache == nil)
    {
        nibCache = [[NSCache alloc] init];
    }
    NSString *pathKey = [NSString stringWithFormat:@"%@.%@", bundle.bundleIdentifier, nibName];
    UINib *nib = [nibCache objectForKey:pathKey];
    if (nib == nil)
    {
        NSString *nibPath = [bundle pathForResource:nibName ofType:@"nib"];
        if (nibPath) nib = [UINib nibWithNibName:nibName bundle:bundle];
        [nibCache setObject:nib ?: [NSNull null] forKey:pathKey];
    }
    else if ([nib isKindOfClass:[NSNull class]])
    {
        nib = nil;
    }
    
    if (nib)
    {
        //attempt to load from nib
        NSArray *contents = [nib instantiateWithOwner:owner options:nil];
        UIView *view = [contents count]? [contents objectAtIndexSafe:0]: nil;
        NSAssert ([view isKindOfClass:self], @"First object in nib '%@' was '%@'. Expected '%@'", nibName, view, self);
        return view;
    }
    
    //return empty view
    return [[[self class] alloc] init];
}

- (void)loadContentsWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
    NSString *nibName = nibNameOrNil ?: NSStringFromClass([self class]);
    UIView *view = [UIView instanceWithNibName:nibName bundle:bundleOrNil owner:self];
    if (view)
    {
        if (CGSizeEqualToSize(self.frame.size, CGSizeZero))
        {
            //if we have zero size, set size from content
            self.size = view.size;
        }
        else
        {
            //otherwise set content size to match our size
            view.frame = self.contentBounds;
        }
        [self addSubview:view];
    }
}

//view searching

- (UIView *)viewMatchingPredicate:(NSPredicate *)predicate
{
    if ([predicate evaluateWithObject:self])
    {
        return self;
    }
    for (UIView *view in self.subviews)
    {
        UIView *match = [view viewMatchingPredicate:predicate];
        if (match) return match;
    }
    return nil;
}

- (UIView *)viewWithTag:(NSInteger)tag ofClass:(Class)viewClass
{
    return [self viewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused NSDictionary *bindings) {
        return [evaluatedObject tag] == tag && [evaluatedObject isKindOfClass:viewClass];
    }]];
}

- (UIView *)viewOfClass:(Class)viewClass
{
    return [self viewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused NSDictionary *bindings) {
        return [evaluatedObject isKindOfClass:viewClass];
    }]];
}

- (NSArray *)viewsMatchingPredicate:(NSPredicate *)predicate
{
    NSMutableArray *matches = [NSMutableArray array];
    if ([predicate evaluateWithObject:self])
    {
        [matches addObject:self];
    }
    for (UIView *view in self.subviews)
    {
        //check for subviews
        //avoid creating unnecessary array
        if ([view.subviews count])
        {
            [matches addObjectsFromArray:[view viewsMatchingPredicate:predicate]];
        }
        else if ([predicate evaluateWithObject:view])
        {
            [matches addObject:view];
        }
    }
    return matches;
}

- (NSArray *)viewsWithTag:(NSInteger)tag
{
    return [self viewsMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused id bindings) {
        return [evaluatedObject tag] == tag;
    }]];
}

- (NSArray *)viewsWithTag:(NSInteger)tag ofClass:(Class)viewClass
{
    return [self viewsMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused id bindings) {
        return [evaluatedObject tag] == tag && [evaluatedObject isKindOfClass:viewClass];
    }]];
}

- (NSArray *)viewsOfClass:(Class)viewClass
{
    return [self viewsMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused id bindings) {
        return [evaluatedObject isKindOfClass:viewClass];
    }]];
}

- (UIView *)firstSuperviewMatchingPredicate:(NSPredicate *)predicate
{
    if ([predicate evaluateWithObject:self])
    {
        return self;
    }
    return [self.superview firstSuperviewMatchingPredicate:predicate];
}

- (UIView *)firstSuperviewOfClass:(Class)viewClass
{
    return [self firstSuperviewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *superview, __unused id bindings) {
        return [superview isKindOfClass:viewClass];
    }]];
}

- (UIView *)firstSuperviewWithTag:(NSInteger)tag
{
    return [self firstSuperviewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *superview, __unused id bindings) {
        return superview.tag == tag;
    }]];
}

- (UIView *)firstSuperviewWithTag:(NSInteger)tag ofClass:(Class)viewClass
{
    return [self firstSuperviewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *superview, __unused id bindings) {
        return superview.tag == tag && [superview isKindOfClass:viewClass];
    }]];
}

- (BOOL)viewOrAnySuperviewMatchesPredicate:(NSPredicate *)predicate
{
    if ([predicate evaluateWithObject:self])
    {
        return YES;
    }
    return [self.superview viewOrAnySuperviewMatchesPredicate:predicate];
}

- (BOOL)viewOrAnySuperviewIsKindOfClass:(Class)viewClass
{
    return [self viewOrAnySuperviewMatchesPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *superview, __unused id bindings) {
        return [superview isKindOfClass:viewClass];
    }]];
}

- (BOOL)isSuperviewOfView:(UIView *)view
{
    return [self firstSuperviewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *superview, __unused id bindings) {
        return superview == view;
    }]] != nil;
}

- (BOOL)isSubviewOfView:(UIView *)view
{
    return [view isSuperviewOfView:self];
}

//responder chain

- (UIViewController *)firstViewController
{
    id responder = self;
    while ((responder = [responder nextResponder]))
    {
        if ([responder isKindOfClass:[UIViewController class]])
        {
            return responder;
        }
    }
    return nil;
}

- (UIView *)firstResponder
{
    return [self viewMatchingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, __unused id bindings) {
        return [evaluatedObject isFirstResponder];
    }]];
}

//frame accessors

- (CGPoint)origin
{
    return self.frame.origin;
}

//- (void)setOrigin:(CGPoint)origin
//{
//    CGRect frame = self.frame;
//    frame.origin = origin;
//    self.frame = frame;
//}

- (CGSize)size
{
    return self.frame.size;
}

//- (void)setSize:(CGSize)size
//{
//    CGRect frame = self.frame;
//    frame.size = size;
//    self.frame = frame;
//}

- (CGFloat)top
{
    return self.origin.y;
}

- (void)setTop:(CGFloat)top
{
    CGRect frame = self.frame;
    frame.origin.y = top;
    self.frame = frame;
}

- (CGFloat)left
{
    return self.origin.x;
}

- (void)setLeft:(CGFloat)left
{
    CGRect frame = self.frame;
    frame.origin.x = left;
    self.frame = frame;
}

- (CGFloat)right
{
    return self.left + self.width;
}

- (void)setRight:(CGFloat)right
{
    CGRect frame = self.frame;
    frame.origin.x = right - frame.size.width;
    self.frame = frame;
}

- (CGFloat)bottom
{
    return self.top + self.height;
}

- (void)setBottom:(CGFloat)bottom
{
    CGRect frame = self.frame;
    frame.origin.y = bottom - frame.size.height;
    self.frame = frame;
}

- (CGFloat)width
{
    return self.size.width;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.size.height;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGFloat)x
{
    return self.center.x;
}

- (void)setX:(CGFloat)x
{
    self.center = CGPointMake(x, self.center.y);
}

- (CGFloat)y
{
    return self.center.y;
}

- (void)setY:(CGFloat)y
{
    self.center = CGPointMake(self.center.x, y);
}

//bounds accessors

- (CGSize)boundsSize
{
    return self.bounds.size;
}

- (void)setBoundsSize:(CGSize)size
{
    CGRect bounds = self.bounds;
    bounds.size = size;
    self.bounds = bounds;
}

- (CGFloat)boundsWidth
{
    return self.boundsSize.width;
}

- (void)setBoundsWidth:(CGFloat)width
{
    CGRect bounds = self.bounds;
    bounds.size.width = width;
    self.bounds = bounds;
}

- (CGFloat)boundsHeight
{
    return self.boundsSize.height;
}

- (void)setBoundsHeight:(CGFloat)height
{
    CGRect bounds = self.bounds;
    bounds.size.height = height;
    self.bounds = bounds;
}

//content getters

- (CGRect)contentBounds
{
    return CGRectMake(0.0f, 0.0f, self.boundsWidth, self.boundsHeight);
}

- (CGPoint)contentCenter
{
    return CGPointMake(self.boundsWidth/2.0f, self.boundsHeight/2.0f);
}

//extends IB

- (NSString *)borderColorStr {
    return [UIColor stringForColor:[UIColor colorWithCGColor:self.layer.borderColor]];
}

- (void)setBorderColorStr:(NSString *)borderColorStr {
    self.layer.borderColor = [UIColor colorWithString:borderColorStr].CGColor;
}

- (BOOL)isInterfaceBuilder {
    return [objc_getAssociatedObject(self, @selector(isInterfaceBuilder)) boolValue];
}

- (void)setIsInterfaceBuilder:(BOOL)isInterfaceBuilder {
    objc_setAssociatedObject(self, @selector(isInterfaceBuilder), [NSNumber numberWithBool:isInterfaceBuilder], OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)cornerRadius {
    return self.layer.cornerRadius;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    self.layer.cornerRadius = cornerRadius;
    self.layer.masksToBounds = cornerRadius > 0;
}

- (CGFloat)borderWidth {
    return self.layer.borderWidth;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    self.layer.borderWidth = borderWidth;
}

- (UIColor *)borderColor {
    return [UIColor colorWithCGColor:self.layer.borderColor];
}

- (void)setBorderColor:(UIColor *)borderColor {
    self.layer.borderColor = borderColor.CGColor;
}

- (NSString *)bgColorStr {
    return [UIColor stringForColor:self.backgroundColor];
}

- (void)setBgColorStr:(NSString *)bgColorStr {
    self.backgroundColor = [UIColor colorWithString:bgColorStr];
}

//additional frame setters

- (void)setLeft:(CGFloat)left right:(CGFloat)right
{
    CGRect frame = self.frame;
    frame.origin.x = left;
    frame.size.width = right - left;
    self.frame = frame;
}

- (void)setWidth:(CGFloat)width right:(CGFloat)right
{
    CGRect frame = self.frame;
    frame.origin.x = right - width;
    frame.size.width = width;
    self.frame = frame;
}

- (void)setTop:(CGFloat)top bottom:(CGFloat)bottom
{
    CGRect frame = self.frame;
    frame.origin.y = top;
    frame.size.height = bottom - top;
    self.frame = frame;
}

- (void)setHeight:(CGFloat)height bottom:(CGFloat)bottom
{
    CGRect frame = self.frame;
    frame.origin.y = bottom - height;
    frame.size.height = height;
    self.frame = frame;
}

//animation

- (void)crossfadeWithDuration:(NSTimeInterval)duration
{
    //jump through a few hoops to avoid QuartzCore framework dependency
    CAAnimation *animation = [NSClassFromString(@"CATransition") animation];
    [animation setValue:@"kCATransitionFade" forKey:@"type"];
    animation.duration = duration;
    [self.layer addAnimation:animation forKey:nil];
}

- (void)crossfadeWithDuration:(NSTimeInterval)duration completion:(void (^)(void))completion
{
    [self crossfadeWithDuration:duration];
    if (completion)
    {
        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC));
        dispatch_after(time, dispatch_get_main_queue(), completion);
    }
}

//constraints

- (void)customAddConstraints:(NSArray *)constraints {
    [NSLayoutConstraint activateConstraints:constraints];
}

- (void)removeAllConstraints {
    [NSLayoutConstraint deactivateConstraints:self.constraints];
}

- (void)autoresizesSubview:(UIView *)subview withConstraint:(UIEdgeInsets)padding {
    subview.translatesAutoresizingMaskIntoConstraints = NO;
    NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:4];
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeBottom multiplier:1.0f constant:padding.bottom];
    NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:padding.left];
    NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:padding.right];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:padding.top];
    [constraints addObject:leftConstraint];
    [constraints addObject:rightConstraint];
    [constraints addObject:bottomConstraint];
    [constraints addObject:topConstraint];
    [self customAddConstraints:constraints];
}

- (void)positionSubview:(UIView *)subview withConstraint:(CGPoint)point {
    subview.translatesAutoresizingMaskIntoConstraints = NO;
    NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:2];
    NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:point.x];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:point.y];
    [constraints addObject:leftConstraint];
    [constraints addObject:topConstraint];
    [self customAddConstraints:constraints];
}

- (void)positionSubview:(UIView *)subview atPosition:(UIViewPosition)position constraint:(CGPoint)point {
    subview.translatesAutoresizingMaskIntoConstraints = NO;
    NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:2];
    if (position == UIViewPositionTopLeft || position == UIViewPositionBottomLeft) {
        NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:point.x];
        [constraints addObject:leftConstraint];
    }
    if (position == UIViewPositionTopLeft || position == UIViewPositionTopRight) {
        NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:point.y];
        [constraints addObject:topConstraint];
    }
    if (position == UIViewPositionTopRight || position == UIViewPositionBottomRight) {
        NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:point.y];
        [constraints addObject:rightConstraint];
    }
    if (position == UIViewPositionBottomRight|| position == UIViewPositionBottomLeft) {
        NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0f constant:point.y];
        [constraints addObject:bottomConstraint];
    }
    if (position == UIViewPositionCenter) {
        NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:point.x];
        NSLayoutConstraint *yConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:point.y];
        [constraints addObject:xConstraint];
        [constraints addObject:yConstraint];
    }
    
    [self customAddConstraints:constraints];
}

- (void)addSizeConstraint:(CGSize)size {
    NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:2];
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1.0f constant:size.width];
    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0f constant:size.height];
    [constraints addObject:widthConstraint];
    [constraints addObject:heightConstraint];
    
    [self customAddConstraints:constraints];
}

//tap
- (UITapGestureRecognizer *)addTapGesture:(void (^)(UITapGestureRecognizer *tapGestureRecognizer))aBlock {
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionTapGesture:)];
    [tap setCancelsTouchesInView:NO];
    [self addGestureRecognizer:tap];
    
//    objc_setAssociatedObject(self, @selector(actionTapGesture:), aBlock, OBJC_ASSOCIATION_COPY);
    
    return tap;
}

- (void)actionTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer {
    void (^aBlock)(UITapGestureRecognizer *tapGestureRecognizer) = objc_getAssociatedObject(self, @selector(actionTapGesture:));
    
    if (aBlock) {
        aBlock(tapGestureRecognizer);
    }
}

- (void)addTapGestureWithBlock:(void(^)(void))aBlock {
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionTap)];
    [tap setCancelsTouchesInView:NO];
    [self addGestureRecognizer:tap];
    
    objc_setAssociatedObject(self, &viewTapKey, aBlock, OBJC_ASSOCIATION_COPY);
}

- (void)actionTap {
    void (^aBlock)(void) = objc_getAssociatedObject(self, &viewTapKey);
    
    if (aBlock) aBlock();
}

- (void)removeTapGesture {
    objc_removeAssociatedObjects(self);
}

//border

- (UIView *)customBorderWithSize:(CGFloat)size andPosition:(UIViewBorderPosition)position andColor:(UIColor *)color andLeadingInset:(CGFloat)leadingInset andTrailingInset:(CGFloat)trailingInset {
    UIImageView *border = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height)];
    border.image = [UIImage imageWithColor:color];
    border.translatesAutoresizingMaskIntoConstraints = NO;
    [self addSubview:border];
    NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:4];
    if (position == UIViewBorderPositionTop || position == UIViewBorderPositionBottom) {
        NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:size];
        NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:leadingInset];
        NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:border attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:trailingInset];
        [constraints addObject:left];
        [constraints addObject:right];
        [constraints addObject:height];
        if (position == UIViewBorderPositionTop) {
            NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:.0f];
            [constraints addObject:top];
        } else {
            NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0f constant:.0f];
            [constraints addObject:bottom];
        }
        [self customAddConstraints:constraints];
    } else {
        NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:leadingInset];
        NSLayoutConstraint *bottom = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:border attribute:NSLayoutAttributeBottom multiplier:1.0f constant:trailingInset];
        NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:size];
        [constraints addObject:top];
        [constraints addObject:bottom];
        [constraints addObject:width];
        if (position == UIViewBorderPositionLeft) {
            NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:.0f];
            [constraints addObject:left];
        } else {
            NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:border attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:.0f];
            [constraints addObject:right];
        }
        [self customAddConstraints:constraints];
    }
    return border;
}

@end
